package com.yang.bean.util;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * @Description: 反射工具类
 * @author: Yang Qiang
 * @create: 2021-11-08 20:44
 */
public class ReflectionUtils {

    /**
     * 通过反射创建一个对象
     * @param cls
     * @return
     */
    public static Object creatBean(Class<?> cls, Object... args) {
        // 使用构造方法创建
        try {
            Constructor<?> constructor = cls.getConstructor();
            return constructor.newInstance(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 属性填充值, 通过反射为对象的属性赋值
     * @param singleton: 对象
     * @param name: 属性名称
     * @param valueToRef: 属性对应的值
     */
    public static void setProperty(Object singleton, String name, Object valueToRef) {

        try {
            // 通过反射拿到对象的属性对象
            Field filed = singleton.getClass().getDeclaredField(name);
            // 私有属性爆破
            filed.setAccessible(true);
            // 为属性赋值
            filed.set(singleton, valueToRef);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取对象里面的属性的类型
     * @param className
     * @param name
     * @return
     */
    public static Class<?> getTypeByFieldName(String className, String name) {
        try {
            Class<?> aClass = Class.forName(className);
            Field fieldName = aClass.getDeclaredField(name);
            return fieldName.getType();
        } catch (Exception e) {
            e.printStackTrace();
        }


        return null;
    }
}
